﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;

namespace GestorDeFlotas.Core
{
    public class Chofer : Persona
    {
        public Chofer(int ID)
        {
            this.Id = ID;
        }

        public Chofer()
        {
        }

        public bool Activo { get; set; }

        public Chofer Cargar()
        {
            using (SqlConnection connection = SqlUtils.GetConnection())
            {
                string sql = string.Format("SELECT [cho_nombre],[cho_mail],[cho_dni],[cho_telefono],[cho_apellido],[cho_direccion],[cho_fecha_nac],[cho_activo]" +
                    "FROM [CRAZY_TAXI].[TL_CHOFERES] WHERE [cho_id] = {0}", this.Id);
                SqlCommand getChofer = SqlUtils.GetNewCommand(sql);
                getChofer.Connection = connection;
                getChofer.Connection.Open();
                SqlDataReader reader = getChofer.ExecuteReader();

                if (reader.HasRows)
                {
                    reader.Read();
                    this.Nombre = reader.GetString(0);
                    this.Mail = reader.GetString(1);
                    this.DNI = Convert.ToInt32(reader.GetDecimal(2));
                    this.Tel = Convert.ToInt32(reader.GetDecimal(3));
                    this.Apellido = reader.GetString(4);
                    this.Direccion = reader.GetString(5);
                    this.Fecha_Nacimiento = reader.GetDateTime(6);
                    this.Activo = reader.GetBoolean(7);
                }
                else
                {
                    throw new Exception(string.Format("No existe un Chofer con id {0}.", this.Id));
                }

                reader.Close();
                return this;
            }
        }

        public void SetInactivo()
        {
            using (SqlConnection connection = SqlUtils.GetConnection())
            {
                string sql = "UPDATE [CRAZY_TAXI].[TL_CHOFERES] SET cho_activo = 0 WHERE cho_id = @ChoferId";

                SqlCommand updateRecord = SqlUtils.GetNewCommand(sql);

                SqlParameter rowParameter = new SqlParameter("@ChoferId", SqlDbType.Int);
                rowParameter.IsNullable = false;
                rowParameter.Value = this.Id;

                updateRecord.Parameters.Add(rowParameter);
                updateRecord.Connection = connection;
                updateRecord.Connection.Open();
                updateRecord.ExecuteNonQuery();
            }
        }

        public void Crear()
        {
            using (SqlConnection connection = SqlUtils.GetConnection())
            {
                connection.Open();

                string sql = "INSERT INTO [CRAZY_TAXI].[TL_CHOFERES] ([cho_nombre],[cho_apellido],[cho_dni],[cho_direccion],[cho_telefono],[cho_mail],[cho_fecha_nac],[cho_activo]) " +
                    " VALUES (@Nombre, @Apellido, @Dni, @Direccion, @Telefono, @Mail, @FechaNac, @Activo)";

                SqlCommand crearChofer = SqlUtils.GetNewCommand(sql);

                SetearParametros(crearChofer);

                crearChofer.Connection = connection;
                crearChofer.ExecuteNonQuery();
            }
        }

        public void Modificar()
        {
            using (SqlConnection connection = SqlUtils.GetConnection())
            {
                connection.Open();
                string sql = "UPDATE [CRAZY_TAXI].[TL_CHOFERES] SET " +
                    "[cho_nombre] = @Nombre, " +
                    "[cho_apellido] = @Apellido, " +
                    "[cho_dni] = @Dni, " +
                    "[cho_direccion] = @Direccion, " +
                    "[cho_telefono] = @Telefono, " +
                    "[cho_mail] = @Mail, " +
                    "[cho_fecha_nac] = @FechaNac, " + 
                    "[cho_activo] = @Activo " +
                    "WHERE [cho_id] = @Id";
                SqlCommand modificarChofer = SqlUtils.GetNewCommand(sql);

                SetearParametros(modificarChofer);

                SqlParameter paramId = new SqlParameter("@Id", SqlDbType.Int);
                paramId.IsNullable = false;
                paramId.Value = this.Id;
                modificarChofer.Parameters.Add(paramId);

                modificarChofer.Connection = connection;
                modificarChofer.ExecuteNonQuery();
            }
        }

        private void SetearParametros(SqlCommand sql)
        {
            SqlParameter paramNombre = new SqlParameter("@Nombre", SqlDbType.VarChar);
            paramNombre.IsNullable = false;
            paramNombre.Value = this.Nombre;

            SqlParameter paramApellido = new SqlParameter("@Apellido", SqlDbType.VarChar);
            paramApellido.IsNullable = false;
            paramApellido.Value = this.Apellido;

            SqlParameter paramDni = new SqlParameter("@Dni", SqlDbType.Int);
            paramDni.IsNullable = false;
            paramDni.Value = this.DNI;

            SqlParameter paramDireccion = new SqlParameter("@Direccion", SqlDbType.VarChar);
            paramDireccion.IsNullable = false;
            paramDireccion.Value = this.Direccion;

            SqlParameter paramTel = new SqlParameter("@Telefono", SqlDbType.Int);
            paramTel.IsNullable = false;
            paramTel.Value = this.Tel;

            SqlParameter paramMail = new SqlParameter("@Mail", SqlDbType.VarChar);
            paramMail.IsNullable = true;
            paramMail.Value = this.Mail;

            SqlParameter paramFechaNac = new SqlParameter("@FechaNac", SqlDbType.DateTime);
            paramFechaNac.IsNullable = false;
            paramFechaNac.Value = this.Fecha_Nacimiento;

            SqlParameter paramActivo = new SqlParameter("@Activo", SqlDbType.Bit);
            paramActivo.IsNullable = false;
            paramActivo.Value = 1;

            sql.Parameters.Add(paramNombre);
            sql.Parameters.Add(paramApellido);
            sql.Parameters.Add(paramDni);
            sql.Parameters.Add(paramDireccion);
            sql.Parameters.Add(paramTel);
            sql.Parameters.Add(paramMail);
            sql.Parameters.Add(paramFechaNac);
            sql.Parameters.Add(paramActivo);
        }
    }
}
